/**
 * selectors:
 *
 * Query				-> Group '$'
 *
 *
 * Group					-> Group ',' Selector
 * 						-> Selector
 *
 * Selector 			-> Selector Combinator Simple_Selector
 * 						->	Simple_Selector
 *
 * Combinator			-> ' '
 *	 					-> '>'
 * 						-> '+'
 * 						-> '~'
 *
 * Simple_Selector	-> Type_Selector Type_Attribute
 * 						-> Type_Selector
 * 						-> Type_Attribute
 *
 * Type_Attribute		-> Type_Attribute Hash
 * 						-> Type_Attribute Class
 * 						-> Type_Attribute Pseudo
 * 						-> Type_Attribute Attribute
 * 						-> Hash
 * 						-> Class
 * 						-> Pseudo
 * 						-> Attribute
 *
 * Type_Selector		-> 'name'
 * 						-> 'name' '|' 'name'
 * 						-> '|' 'name'
 *
 * Attribute			-> '[' 'name' ']'
 * 						-> '[' 'name' '=' Value ']'
 * 						-> '[' 'name' '!=' Value ']'
 * 						-> '[' 'name' '*=' Value ']'
 * 						-> '[' 'name' '^=' Value ']'
 * 						-> '[' 'name' '$=' Value ']'
 * 						-> '[' 'name' '~=' Value ']'
 *
 * Hash					-> '#' 'name'
 *
 * Class					-> '.' 'name'
 *
 * Pseudo				-> ':' 'name'
 * 						-> ':' 'name' '(' Value ')'
 * 						-> '::' 'name'
 * 						-> '::' 'name' '(' Value ')'
 *
 * Value				-> Simple_Selector
 * 						-> 'string'
 * 						-> '$garbage$'
 * 						-> Inner_Bracket
 *
 * Inner_Bracket		-> '[' Inner_Bracket ']'
 * 						-> Inner_Bracket '$garbage'
 * 						-> '$garbage'
 *
 */

Jx.categorize('lang.css.selector.parser', {

	$extend: 'Jx.code.Parser',

	tokenizer: 'lang.css.selector.tokenizer',

	states: {

		'start': {
			'Group': 'i26',
			'Selector': 'i24',
			'Simple_Selector': 'i23',
			'Type_Selector': 'i4',
			'Type_Attribute': 'i21',
			'Hash': 'i19',
			'Class': 'i19',
			'Pseudo': 'i19',
			'Attribute': 'i19',
			'|': 'i2',
			'name': 'i1',
			'*': 'i1',
			'#': 'i5',
			'.': 'i7',
			'[': 'i9',
			':': 'i14',
			'::': 'i14'
		},

		'i1': {
			'|': 'i2'
		},

		'i2': {
			'name': 'i3',
			'*': 'i3'
		},

		'i3': {},

		'i4': {
			'Type_Attribute': 'i20',
			'Hash': 'i19',
			'Class': 'i19',
			'Pseudo': 'i19',
			'Attribute': 'i19',
			'#': 'i5',
			'.': 'i7',
			'[': 'i9',
			':': 'i14',
			'::': 'i14'
		},

		'i5': {
			'name': 'i6'
		},

		'i6': {},

		'i7': {
			'name': 'i8'
		},

		'i8': {},

		'i9': {
			'name': 'i10'
		},

		'i10': {
			']': 'i11',
			'=': 'i12',
			'!=': 'i12',
			'^=': 'i12',
			'$=': 'i12',
			'~=': 'i12',
			'*=': 'i12'
		},

		'i11': {},

		'i12': {
			'Value': 'i13',
			'string': 'i13',

			'Inner_Bracket': 'i28',

			'Inner_Parenth': 'i28',

			'[': 'i29',

			'(': 'i32',

			'whitespace': 'i28',
			'>': 'i28',
			'+': 'i28',
			'~': 'i28',
			'=': 'i28',
			'!=': 'i28',
			'^=': 'i28',
			'$=': 'i28',
			'~=': 'i28',
			'*=': 'i28',
			'|': 'i28',
			'name': 'i28',
			'*': 'i28',
			'#': 'i28',
			'.': 'i28',
			':': 'i28',
			'::': 'i28',
			'$garbage$': 'i28'

		},

		'i13': {
			']': 'i11'
		},

		'i14': {
			'name': 'i15'
		},

		'i15': {
			'(': 'i16'
		},

		'i16': {
			'Value': 'i17',
			'string': 'i17',

			'Inner_Bracket': 'i22',

			'Inner_Parenth': 'i22',

			'[': 'i29',

			'(': 'i32',


			'whitespace': 'i22',
			'>': 'i22',
			'+': 'i22',
			'~': 'i22',
			'=': 'i22',
			'!=': 'i22',
			'^=': 'i22',
			'$=': 'i22',
			'~=': 'i22',
			'*=': 'i22',
			'|': 'i22',
			'name': 'i22',
			'*': 'i22',
			'#': 'i22',
			'.': 'i22',
			':': 'i22',
			'::': 'i22',
			'$garbage$': 'i22'
		},

		'i17': {
			')': 'i18'
		},

		'i18': {},

		'i19': {},

		'i20': {

			'Hash': 'i19',
			'Class': 'i19',
			'Pseudo': 'i19',
			'Attribute': 'i19',
			'#': 'i5',
			'.': 'i7',
			'[': 'i9',
			':': 'i14',
			'::': 'i14'

		},

		'i21': {
			'Hash': 'i19',
			'Class': 'i19',
			'Pseudo': 'i19',
			'Attribute': 'i19',
			'#': 'i5',
			'.': 'i7',
			'[': 'i9',
			':': 'i14',
			'::': 'i14'
		},

		'i22': {

			'Inner_Bracket': 'i22',

			'Inner_Parenth': 'i22',

			'[': 'i29',

			'(': 'i32',

			'whitespace': 'i22',
			'>': 'i22',
			'+': 'i22',
			'~': 'i22',
			']': 'i22',
			'=': 'i22',
			'!=': 'i22',
			'^=': 'i22',
			'$=': 'i22',
			'~=': 'i22',
			'*=': 'i22',
			'|': 'i22',
			'name': 'i22',
			'*': 'i22',
			'#': 'i22',
			'.': 'i22',
			'[': 'i22',
			':': 'i22',
			'::': 'i22',
			'string': 'i22',
			'$garbage$': 'i22'

		},

		'i23': {},

		'i24': {

			'whitespace': 'i25',
			'>': 'i25',
			'+': 'i25',
			'~': 'i25'

		},

		'i25':{
			'Simple_Selector': 'i23',
			'Type_Selector': 'i4',
			'Type_Attribute': 'i21',
			'Hash': 'i19',
			'Class': 'i19',
			'Pseudo': 'i19',
			'Attribute': 'i19',
			'|': 'i2',
			'name': 'i1',
			'*': 'i1',
			'#': 'i5',
			'.': 'i7',
			'[': 'i9',
			':': 'i14',
			'::': 'i14'
		},

		'i26': {

			'$': 'end',
			',': 'i27'

		},

		'i27':{

			'Selector': 'i24',
			'Simple_Selector': 'i23',
			'Type_Selector': 'i4',
			'Type_Attribute': 'i21',
			'Hash': 'i19',
			'Class': 'i19',
			'Pseudo': 'i19',
			'Attribute': 'i19',
			'|': 'i2',
			'name': 'i1',
			'*': 'i1',
			'#': 'i5',
			'.': 'i7',
			'[': 'i9',
			':': 'i14',
			'::': 'i14'

		},

		'i28': {

			'Inner_Bracket': 'i28',

			'Inner_Parenth': 'i28',

			'[': 'i29',

			'(': 'i32',

			'whitespace': 'i28',
			'>': 'i28',
			'+': 'i28',
			'~': 'i28',
			'=': 'i28',
			'!=': 'i28',
			'^=': 'i28',
			'$=': 'i28',
			'~=': 'i28',
			'*=': 'i28',
			'|': 'i28',
			'name': 'i28',
			'*': 'i28',
			'#': 'i28',
			'.': 'i28',
			':': 'i28',
			'::': 'i28',
			'string': 'i28',
			'$garbage$': 'i28'

		},

		/* base for Inner_Bracket start */
		'i29': {

			'Inner_Bracket_Recursion': 'i29',

			'Inner_Parenth': 'i29',

			'(': 'i32',

			'[': 'i30',

			']': 'i31',

			'whitespace': 'i29',
			'>': 'i29',
			'+': 'i29',
			'~': 'i29',
			'=': 'i29',
			'!=': 'i29',
			'^=': 'i29',
			'$=': 'i29',
			'~=': 'i29',
			'*=': 'i29',
			'|': 'i29',
			'name': 'i29',
			'*': 'i29',
			'#': 'i29',
			'.': 'i29',
			':': 'i29',
			'::': 'i29',
			'string': 'i29',
			'$garbage$': 'i29'

		},

		/* recursion of Inner_Bracket start */
		'i30': {

			'Inner_Bracket': 'i30',

			'Inner_Parenth': 'i30',

			'(': 'i32',

			'[': 'i29',

			']': 'i31',

			'whitespace': 'i30',
			'>': 'i30',
			'+': 'i30',
			'~': 'i30',
			'=': 'i30',
			'!=': 'i30',
			'^=': 'i30',
			'$=': 'i30',
			'~=': 'i30',
			'*=': 'i30',
			'|': 'i30',
			'name': 'i30',
			'*': 'i30',
			'#': 'i30',
			'.': 'i30',
			':': 'i30',
			'::': 'i30',
			'string': 'i30',
			'$garbage$': 'i30'

		},

		'i31': {},


		/* base for Inner_Parenthesis start */
		'i32': {

			'Inner_Parenth_Recursion': 'i32',

			'Inner_Bracket': 'i32',

			'[': 'i29',

			'(': 'i33',

			')': 'i34',

			'whitespace': 'i32',
			'>': 'i32',
			'+': 'i32',
			'~': 'i32',
			'=': 'i32',
			'!=': 'i32',
			'^=': 'i32',
			'$=': 'i32',
			'~=': 'i32',
			'*=': 'i32',
			'|': 'i32',
			'name': 'i32',
			'*': 'i32',
			'#': 'i32',
			'.': 'i32',
			':': 'i32',
			'::': 'i32',
			'string': 'i32',
			'$garbage$': 'i32'

		},

		/* recursion of Inner_Parenthesis start */
		'i33': {

			'Inner_Parenth': 'i33',

			'Inner_Bracket': 'i33',

			'[': 'i29',

			'(': 'i32',

			')': 'i34',

			'whitespace': 'i33',
			'>': 'i33',
			'+': 'i33',
			'~': 'i33',
			'=': 'i33',
			'!=': 'i33',
			'^=': 'i33',
			'$=': 'i33',
			'~=': 'i33',
			'*=': 'i33',
			'|': 'i33',
			'name': 'i33',
			'*': 'i33',
			'#': 'i33',
			'.': 'i33',
			':': 'i33',
			'::': 'i33',
			'string': 'i33',
			'$garbage$': 'i33'

		},

		'i34': {},


/**
 *	Query .
 *
 *	- reduce Query
 */
		'end': {}


	},

	anchors: [

		'start:i1:Type_Selector',
		'start:i2:Type_Selector',
		'start:i4:Simple_Selector',
		'start:i5:Hash',
		'start:i7:Class',
		'start:i9:Attribute',
		'start:i14:Pseudo',
		'start:i19:Type_Attribute',
		'start:i21:Simple_Selector',
		'start:i21:Type_Attribute',
		'start:i23:Selector',
		'start:i24:Selector',
		'start:i24:Group',
		'start:i26:Group',
		'start:i26:Query',

		'i4:i5:Hash',
		'i4:i7:Class',
		'i4:i9:Attribute',
		'i4:i14:Pseudo',
		'i4:i19:Type_Attribute',
		'i4:i20:Type_Attribute',

		'i12:i28:Value',
		'i12:i29:Inner_Bracket',
		'i12:i32:Inner_Parenth',

		'i16:i22:Value',
		'i16:i29:Inner_Bracket',
		'i16:i32:Inner_Parenth',

		'i20:i5:Hash',
		'i20:i7:Class',
		'i20:i9:Attribute',
		'i20:i14:Pseudo',

		'i21:i5:Hash',
		'i21:i7:Class',
		'i21:i9:Attribute',
		'i21:i14:Pseudo',

		'i22:i29:Inner_Bracket',
		'i22:i32:Inner_Parenth',

		'i25:i4:Simple_Selector',
		'i25:i1:Type_Selector',
		'i25:i2:Type_Selector',
		'i25:i5:Hash',
		'i25:i7:Class',
		'i25:i9:Attribute',
		'i25:i14:Pseudo',
		'i25:i19:Type_Attribute',
		'i25:i21:Simple_Selector',
		'i25:i21:Type_Attribute',

		'i27:i4:Simple_Selector',
		'i27:i1:Type_Selector',
		'i27:i2:Type_Selector',
		'i27:i5:Hash',
		'i27:i7:Class',
		'i27:i9:Attribute',
		'i27:i14:Pseudo',
		'i27:i19:Type_Attribute',
		'i27:i21:Type_Attribute',
		'i27:i21:Simple_Selector',
		'i27:i23:Selector',
		'i27:i24:Selector',


		'i28:i29:Inner_Bracket',
		'i28:i32:Inner_Parenth',

		'i29:i30:Inner_Bracket_Recursion',
		'i29:i32:Inner_Parenth',

		'i30:i29:Inner_Bracket',
		'i30:i32:Inner_Parenth',

		'i32:i33:Inner_Parenth_Recursion',
		'i32:i29:Inner_Bracket',

		'i33:i32:Inner_Parenth',
		'i33:i29:Inner_Bracket',



	],

	reduceStates: {

		'start': {
			'name': 'Type_Selector',
			'*': 'Type_Selector',

			'Type_Selector': 'Simple_Selector',
			'Type_Attribute': 'Simple_Selector',

			'Hash': 'Type_Attribute',
			'Class': 'Type_Attribute',
			'Pseudo': 'Type_Attribute',
			'Attribute': 'Type_Attribute',

			'Simple_Selector': 'Selector',
			'Selector': 'Group'

		},

		'i2': {
			'name': 'Type_Selector',
			'*': 'Type_Selector'
		},

		'i4': {
			'Type_Attribute': 'Simple_Selector',
			'Hash': 'Type_Attribute',
			'Class': 'Type_Attribute',
			'Pseudo': 'Type_Attribute',
			'Attribute': 'Type_Attribute'
		},

		'i5': {
			'name': 'Hash'
		},

		'i7': {
			'name': 'Class'
		},

		'i10': {
			']': 'Attribute'
		},

		'i12': {
			'Inner_Bracket': 'Value',
			'whitespace': 'Value',
			'>': 'Value',
			'+': 'Value',
			'~': 'Value',
			'=': 'Value',
			'^=': 'Value',
			'$=': 'Value',
			'~=': 'Value',
			'*=': 'Value',
			'|': 'Value',
			'name': 'Value',
			'*': 'Value',
			'#': 'Value',
			'.': 'Value',
			':': 'Value',
			'::': 'Value',
			'(': 'Value',
			')': 'Value',
			'$garbage$': 'Value'

		},

		'i13': {
			']': 'Attribute'
		},

		'i14': {
			'name': 'Pseudo'
		},

		'i16': {
			'whitespace': 'Value',
			'>': 'Value',
			'+': 'Value',
			'~': 'Value',
			'=': 'Value',
			'^=': 'Value',
			'$=': 'Value',
			'~=': 'Value',
			'*=': 'Value',
			'|': 'Value',
			'name': 'Value',
			'*': 'Value',
			'#': 'Value',
			'.': 'Value',
			':': 'Value',
			'::': 'Value',
			'string': 'Value',
			'$garbage$': 'Value'
		},

		'i17': {
			')': 'Pseudo'
		},

		'i20': {
			'Hash': 'Type_Attribute',
			'Class': 'Type_Attribute',
			'Pseudo': 'Type_Attribute',
			'Attribute': 'Type_Attribute'
		},

		'i21': {
			'Hash': 'Type_Attribute',
			'Class': 'Type_Attribute',
			'Pseudo': 'Type_Attribute',
			'Attribute': 'Type_Attribute'
		},

		'i22': {

			'Inner_Bracket': 'Value',
			'Inner_Parenth': 'Value',

			'whitespace': 'Value',
			'>': 'Value',
			'+': 'Value',
			'~': 'Value',
			'=': 'Value',
			'^=': 'Value',
			'$=': 'Value',
			'~=': 'Value',
			'*=': 'Value',
			'|': 'Value',
			'name': 'Value',
			'*': 'Value',
			'#': 'Value',
			'.': 'Value',
			':': 'Value',
			'::': 'Value',
			'string': 'Value',
			'$garbage$': 'Value'
		},

		'i25':{
			'Simple_Selector': 'Selector',
			'name': 'Type_Selector',
			'*': 'Type_Selector',

			'Type_Selector': 'Simple_Selector',
			'Type_Attribute': 'Simple_Selector',

			'Hash': 'Type_Attribute',
			'Class': 'Type_Attribute',
			'Pseudo': 'Type_Attribute',
			'Attribute': 'Type_Attribute'
		},

		'i26': {
			'$':'Query'
		},

		'i27': {
			'Selector': 'Group',
			'Simple_Selector': 'Selector',
			'name': 'Type_Selector',
			'*': 'Type_Selector',

			'Type_Selector': 'Simple_Selector',
			'Type_Attribute': 'Simple_Selector',

			'Hash': 'Type_Attribute',
			'Class': 'Type_Attribute',
			'Pseudo': 'Type_Attribute',
			'Attribute': 'Type_Attribute'
		},

		'i28': {
			'Inner_Bracket': 'Value',
			'Inner_Parenth': 'Value',
			'whitespace': 'Value',
			'>': 'Value',
			'+': 'Value',
			'~': 'Value',
			'=': 'Value',
			'^=': 'Value',
			'$=': 'Value',
			'~=': 'Value',
			'*=': 'Value',
			'|': 'Value',
			'name': 'Value',
			'*': 'Value',
			'#': 'Value',
			'.': 'Value',
			':': 'Value',
			'::': 'Value',
			'string': 'Value',
			'$garbage$': 'Value'
		},

		'i29': {
			']':'Inner_Bracket'
		},

		'i30': {
			']':'Inner_Bracket_Recursion'
		},

		'i32': {
			')':'Inner_Parenth'
		},

		'i33': {
			')':'Inner_Parenth_Recursion'
		}

	}




});
